Este documento presenta una introducción a los shells en Linux. Explica qué es un shell y los diferentes tipos disponibles como Bash, C shell y tcsh. Detalla las funciones de los caracteres comodín como * y ? para completar nombres de archivos, y describe cómo las tuberías permiten conectar la salida de un comando a la entrada de otro. Finalmente, introduce comandos comunes como grep, sort, more y less que se usan con tuberías.
Aprende desde cero a utilizar REDIS, una base de datos NoSQL que destaca por su alto rendimiento y velocidad, además de su sencillez. REDIS es ideal para casi cualquier tarea, pero especialmente en entornos críticos de consultas y de monitorización.
Aprende desde cero a utilizar REDIS, una base de datos NoSQL que destaca por su alto rendimiento y velocidad, además de su sencillez. REDIS es ideal para casi cualquier tarea, pero especialmente en entornos críticos de consultas y de monitorización.
Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]RootedCON
Taller introductorio a la explotación de software GNU/Linux. Se explicarán diversos tipos de vulnerabilidades (corrupciones de memoria, fugas de información, condiciones de carrera, etc...) siguiendo metodologías actuales del desarrollo de exploits donde se sortearán las protecciones del sistema operativo.
Slides del taller "The Linux Shell. Shell Scripting desde 0" presentado durante las actividades de la BugCon Security Conferences efectuado en la Escuela Superior de Computo -ESCOM- en el D.F., México, del 13 al 15 de febrero del 2013.
1. LINUX Básico
TAKASHI SUGASAWA
LINUX Básico (6. Shells(1)) 1
2. Programa del curso
1. Introducción a LINUX
2. Operación básica de LINUX
3. Operación de archivos y directorios
4. Editor vi
5. Comprensión del sistema de ficheros
6. Shells(1)
7. Shells(2)
8. Shells(3)
9. Otros comandos
LINUX Básico (6. Shells(1)) 2
3. LINUX Básico
6. Shells(1)
Índice
6.1 Comprensión de shells
6.2 Caracteres para completar nombres
del ficheros
6.3 Tuberías y redireccionamientos de
entrada y salida
6.4 Sustituciones
6.5 Comillas y apóstrofos
6.6 Grupos de comandos
LINUX Básico (6. Shells(1)) 3
4. 6.1 Comprensión de shells
(1) ¿Qué es shell?
• Shell es una aplicación como "Símbolo del sistema" en
el Windows.
• Shell empieza automáticamente cuando un usuario se
registra.
• Shell funciona como interfaz principal entre el sistema
operativo y el usuario.
• Shell interpreta sus comandos u órdenes.
• Shell no es un parte del núcleo del sistema operativo.
• Hay múltiples shells instalados (Shell Bourne, BASH,
Shell C, tcsh, zsh,...). El shell por omisión de LINUX es
bash.
LINUX Básico (6. Shells(1)) 4
5. 6.1(2) Variedad de shells
Shell Bourne • El shell más antiguo.
(/bin/sh) • El shell original de UNIX.
• Está disponible en todos los sistemas de UNIX.
Shell C • El shell antiguo y muy común también.
(/bin/csh) • Está disponible en casi todos los sistemas de UNIX.
• La sintaxis del shell C es muy parecida al lenguaje
de programación C.
BASH • El shell derivado de Shell Bourne.
(/bin/bash) • Proporciona varias características mejoradas.
• El shell por omisión de LINUX
tcsh • El shell derivado de Shell C.
(/bin/tcsh) • Proporciona varias características mejoradas.
Hay otros, Shell Z, Shell Korn, ...
LINUX Básico (6. Shells(1)) 5
6. 6.1(3) Shells disponibles en el sistema
Para saber los shells disponibles en el sistema, se
referimos el archivo "/etc/shells".
[usr001@linuxpc usr001]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/bash2
/bin/ash
/bin/bsh
/bin/tcsh
/bin/csh
LINUX Básico (6. Shells(1)) 6
7. 6.1(4) Cambio el login shell
Para cambiar el login shell, usamos el comando "chsh".
(28) chsh cambiar el login shell.
[usr001@linuxpc usr001]$ chsh
Cambiando intérprete de órdenes para usr001.
Password:
Nuevo intérprete de órdenes [/bin/bash]: /bin/csh
Se ha cambiado el intérprete de órdenes.
[usr001@linuxpc usr001]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
(omisión)
usr000:x:500:500::/home/usr000:/bin/bash
usr001:x:501:501::/home/usr001:/bin/csh
usr002:x:502:502::/home/usr002:/bin/bash
(omisión)
Si no hay una razón especial, vamos a usar BASH.
LINUX Básico (6. Shells(1)) 7
8. 6.2 Caracteres para completar nombres del ficheros
(1) El carácter comodín “*”
• El asterisco “*” es el carácter comodín, significa
cualquiera y todos los caracteres.
• Por ejemplo, “a*” significa todos los ficheros que
comiencen con una a.
[usr001@linuxpc usr001]$ ls
abxx.txt abyy xx.txt xxyyzz
[usr001@linuxpc usr001]$ ls a*
abxx.txt abyy
[usr001@linuxpc usr001]$ ls *.txt
abxx.txt xx.txt
[usr001@linuxpc usr001]$ ls *yy*
abyy xxyyzz
[usr001@linuxpc usr001]$ ls *
abxx.txt abyy xx.txt xxyyzz
[usr001@linuxpc usr001]$ ls b*
ls: b*: No existe el fichero o el directorio
[usr001@linuxpc usr001]$ rm *
[usr001@linuxpc usr001]$ ls
LINUX Básico (6. Shells(1)) 8
9. 6.2(2) El carácter comodín “?”
• El signo interrogación “?” es el carácter comodín,
significa un solo carácter cualquier.
[usr001@linuxpc usr001]$ ls
a1 a2 a3 b1 b2 c1 d
[usr001@linuxpc usr001]$ ls a?
a1 a2 a3
[usr001@linuxpc usr001]$ ls ?1
a1 b1 c1
[usr001@linuxpc usr001]$ ls ??
a1 a2 a3 b1 b2 c1
[usr001@linuxpc usr001]$ ls ?
d
LINUX Básico (6. Shells(1)) 9
10. 6.2(3) La expresión “[ ]”
• La expresión “[ ]” (corchetes) significa un carácter
simple si encierra entre corchetes una serie de
caracteres.
[usr001@linuxpc usr001]$ ls
a1 a2 a3 a4 a5 b1 c1 d1 e1 x1 y1 z1
[usr001@linuxpc usr001]$ ls a[2-4]
a2 a3 a4
[usr001@linuxpc usr001]$ ls [a-z]1
a1 b1 c1 d1 e1 x1 y1 z1
[usr001@linuxpc usr001]$ ls [ace][135]
a1 a3 a5 c1 e1
[usr001@linuxpc usr001]$ ls [a-c,xz]?
a1 a2 a3 a4 a5 b1 c1 x1 z1
LINUX Básico (6. Shells(1)) 10
11. 6.3 Tuberías y redireccionamientos de entrada y
salida
(1) stdin, stdout, stderr
Salida estándar (stdout)
• Algunos comandos envían su salida hacia la pantalla.
A la verdad, estos comandos envían su salida hacia un
archivo especial llamado "stdout", y el sistema de
LINUX asocia "stdout" con la pantalla.
salida std
cat /etc/passwd std
out pantalla
out
LINUX Básico (6. Shells(1)) 11
12. Entrada estándar (stdin)
• Algunos comandos esperan una entrada desde la
terminal o el teclado.
A la verdad, estos comandos esperan la entrada desde
un archivo especial llamado “stdin”, y el sistema de
LINUX asocia "stdin" con el teclado.
teclado entrada salida
std
std std
std
in cat - out pantalla
in out
[usr001@linuxpc usr001]$ cat -
abc
abc
123
123
xyz
xyz
Teclear "Cntl-d"
para escapar.
LINUX Básico (6. Shells(1)) 12
13. Salida de error estándar (stderr)
• Algunos comandos envían un mensaje de error hacia un
pantalla.
A la verdad, estos comandos envían un mensaje de
error hacia un archivo especial llamado "stderr", y el
sistema de LINUX asocia "stderr" con la pantalla.
error std
std
comando err pantalla
err
No existe
[usr001@linuxpc usr001]$ ls
[usr001@linuxpc usr001]$ cat a > b error
cat: a: No existe el fichero o el directorio
[usr001@linuxpc usr001]$ ls
b
se ha [usr001@linuxpc usr001]$ cat b vacío
creado
[usr001@linuxpc usr001]$
"stdout" y "stderr" son diferentes.
LINUX Básico (6. Shells(1)) 13
14. 6.3(2) Tuberías
• Con tuberías, se puede utilizar la salida de un comando
como entrada de otro.
• El carácter de tubería es una barra vertical "|".
(ejemplo) queremos concatenar 2 archivos "/etc/passwd" y
"/etc/group", y verlo con el paginador "more".
si usamos un tubería ...
cat /etc/passwd /etc/group > tmp
cat /etc/passwd /etc/group | more
more tmp
archivo
temporal
• Una tubería conecta el "stdout" de un comando hacia el
"stdin" de otro.
tubería
salida std std entrada
comando1 std std comando2
out
out conectar in
in
LINUX Básico (6. Shells(1)) 14
15. Los comandos “more”, “less”, “grep”, “sort” se utilizan
frecuentemente con las tuberías.
(29) grep buscar patrones que se encuentren en
archivos e informa dónde localiza esos
patrones.
(ej.) grep exp-reg arch1 [arch2 ...]
sale los líneas que contienen “usr00”
[usr000@linuxpc usr000]$ cat /etc/passwd | grep usr00
usr000:x:500:500::/home/usr000:/bin/bash
usr001:x:501:501::/home/usr001:/bin/bash = “grep usr00
usr002:x:502:502::/home/usr002:/bin/bash /etc/passwd”
usr003:x:503:503::/home/usr003:/bin/bash
usr004:x:504:504::/home/usr004:/bin/bash
usr005:x:505:505::/home/usr005:/bin/bash
usr006:x:506:506::/home/usr006:/bin/bash
usr007:x:507:507::/home/usr007:/bin/bash
usr008:x:508:508::/home/usr008:/bin/bash
usr009:x:509:509::/home/usr009:/bin/bash
LINUX Básico (6. Shells(1)) 15
16. (30) sort ordenar archivos de texto.
(ej.) sort arch1 [arch2 ...]
Para la salida en
una sola columna
[usr001@linuxpc usr001]$ ls -i1
400941 a
400940 abc
400936 bc
400942 defg usando primer campo
400937 xyz
[usr001@linuxpc usr001]$ ls -i1 | sort
400936 bc
400937 xyz
400940 abc
400941 a descendentemente
400942 defg
[usr001@linuxpc usr001]$ ls -i1 | sort -r
400942 defg
400941 a
400940 abc
400937 xyz usando segundo campo
400936 bc
[usr001@linuxpc usr001]$ ls -i1 | sort -r +1
400937 xyz
400942 defg
400936 bc
400940 abc
400941 a
LINUX Básico (6. Shells(1)) 16
17. 6.3(3) Redireccionamientos
Redireccionamiento de salida
• Se emplea para redireccionar la salida de un comando
hacia un archivo. En vez de que la salida vaya a la
pantalla de la terminal, se coloca en un archivo.
• Los símbolos de redireccionamiento de salida son “>”,
“>>”, “2>”, “2>>”, “&>”.
[usr001@linuxpc usr001]$ date
jue sep 16 20:08:37 ECT 2004
[usr001@linuxpc usr001]$ date > arch1
[usr001@linuxpc usr001]$ cat arch1
jue sep 16 20:08:42 ECT 2004
LINUX Básico (6. Shells(1)) 17
18. • El redireccionamiento de salida conecta el "stdout" o
“stderr” de un comando hacia un archivo.
std “>”, “>>” arch
std arch
out
out ivo
ivo
salida
“&>”
comando arch
arch
“2>&1” “1>&2”
ivo
ivo
mensaje
de error std
std arch
arch
err
err ivo
ivo
“2>”, “2>>”
LINUX Básico (6. Shells(1)) 18
19. Diferencia entre “>” y “>>” (“2>” y “2>>”)
• Si el archivo no existe, son iguales.
• Si está el archivo, “>” sobrescribe el archivo, “>>” agregar al
archivo.
[usr001@linuxpc usr001]$ ls no existente
[usr001@linuxpc usr001]$ whoami > arch1
[usr001@linuxpc usr001]$ cat arch1
usr001 ya existente
[usr001@linuxpc usr001]$ date > arch1
[usr001@linuxpc usr001]$ cat arch1
se ha sobrescrito
jue sep 16 22:06:45 ECT 2004
[usr001@linuxpc usr001]$ whoami >> arch1
[usr001@linuxpc usr001]$ cat arch1
jue sep 16 22:06:45 ECT 2004
usr001 se ha añadido
(31) whoami Presenta su nombre de usuario.
LINUX Básico (6. Shells(1)) 19
20. “>” y “2>”, “&>”
[usr001@linuxpc usr001]$ ls
arch1
[usr001@linuxpc usr001]$ cat arch1 existente
jue sep 16 22:30:52 ECT 2004
[usr001@linuxpc usr001]$ cat arch1 arch2 no existente
jue sep 16 22:18:33 ECT 2004 salida de “stdout”
cat: arch2: No existe el fichero o el directorio salida de
[usr001@linuxpc usr001]$ cat arch1 arch2 >a 2>b “stderr”
[usr001@linuxpc usr001]$ cat a
jue sep 16 22:18:33 ECT 2004
[usr001@linuxpc usr001]$ cat b
cat: arch2: No existe el fichero o el directorio
[usr001@linuxpc usr001]$ cat arch1 arch2 &>c
[usr001@linuxpc usr001]$ cat c
jue sep 16 22:18:33 ECT 2004
cat: arch2: No existe el fichero o el directorio
LINUX Básico (6. Shells(1)) 20
21. “2>&1” (“1>&2”)
[usr001@linuxpc usr001]$ ls
arch1
[usr001@linuxpc usr001]$ cat arch1 existente
jue sep 16 22:30:52 ECT 2004
[usr001@linuxpc usr001]$ cat arch1 arch2 no existente
jue sep 16 22:30:52 ECT 2004 salida de “stdout”
cat: arch2: No existe el fichero o el directorio salida de
[usr001@linuxpc usr001]$ cat arch1 arch2 2>&1 | sort “stderr”
cat: arch2: No existe el fichero o el directorio
jue sep 16 22:30:52 ECT 2004
[usr001@linuxpc usr001]$ cat arch1 arch2 >a 2>&1 = “&>”
[usr001@linuxpc usr001]$ cat a
jue sep 16 22:30:52 ECT 2004
cat: arch2: No existe el fichero o el directorio
[usr001@linuxpc usr001]$ cat arch1
[usr001@linuxpc usr001]$ cat a
arch2 >>a 2>&1 orden es
jue sep 16 22:30:52 ECT 2004 importante
cat: arch2: No existe el fichero o el directorio
jue sep 16 22:30:52 ECT 2004
cat: arch2: No existe el fichero o el directorio
[usr001@linuxpc usr001]$ cat arch1 arch2 2>&1 >a “2>&1” no
cat: arch2: No existe el fichero o el directorio funciona
[usr001@linuxpc usr001]$ cat a
jue sep 16 22:30:52 ECT 2004
LINUX Básico (6. Shells(1)) 21
22. Redireccionamiento de entrada
• Se usa para redireccionar la entrada en un comando a
fin de que provenga de un archivo y no de la terminal.
• Los símbolos de redireccionamiento de entrada son “<”.
• El símbolo “<” conecta el "stdin” de un comando con
un archivo.
<
arch std entrada
arch std comando
ivo
ivo conectar in
in
[usr001@linuxpc usr001]$ grep usr000 < /etc/passwd
usr000:x:500:500::/home/usr000:/bin/bash los
[usr001@linuxpc usr001]$ cat /etc/passwd | grep usr000 resultados
son
usr000:x:500:500::/home/usr000:/bin/bash iguales.
[usr001@linuxpc usr001]$ grep usr000 /etc/passwd
usr000:x:500:500::/home/usr000:/bin/bash
LINUX Básico (6. Shells(1)) 22
23. 6.4 Sustituciones
(1) Sustitución de variables
• Los variables son disponibles en el shell.
• Algunos variables se definen por el shell o el sistema
de LINUX.
Variables principales disponibles en el shell
HOME Nombre de ruta de acceso completo de su directorio base.
LOGNAME Su nombre de usuario.
PATH Directorios en los que el shell busca comandos.
PS1 Principal indicador del shell.
PWD Nombre de ruta de acceso completo del directorio de trabajo
actual.
SHELL Nombre de su shell actual.
TERM Tipo de terminal que utiliza usted.
LINUX Básico (6. Shells(1)) 23
24. • Con el carácter “$”, podemos sustituir el nombre de un
variable con su valor.
sustituir
[usr000@linuxpc usr000]$ echo $HOME
/home/usr000 echo /home/usr000
[usr000@linuxpc usr000]$ ls -la $HOME
total 28
drwx------ 2 usr000 usr000 4096 sep 17 12:37 .
drwxr-xr-x 15 root root 4096 sep 15 23:46 ..
-rw------- 1 usr000 usr000 1332 sep 17 12:28 .bash_history
-rw-r--r-- 1 usr000 usr000 24 sep 15 23:39 .bash_logout
-rw-r--r-- 1 usr000 usr000 191 sep 15 23:39 .bash_profile
-rw-r--r-- 1 usr000 usr000 124 sep 15 23:39 .bashrc
-rw-r--r-- 1 usr000 usr000 120 sep 15 23:39 .gtkrc
[usr000@linuxpc usr000]$ cd $HOME
cambia el directorio de trabajo
actual a su directorio base.
= “cd”
= “cd ~”
(32) echo Toma el argumento que se le pasa y lo
escribe a la salida estándar.
LINUX Básico (6. Shells(1)) 24
25. 6.4(2) Sustitución de comandos
• La sustitución de comandos sustituye el resultado de un
comando por un parámetro de posición.
• Para sustituir un comando, ponemos el comando entre
dos “`” (acentos graves). ` comando `
[usr001@linuxpc usr001]$ whoami
usr001
[usr001@linuxpc usr001]$ echo `whoami` = “echo usr001”
usr001
[usr001@linuxpc usr001]$ grep `whoami` /etc/passwd
usr001:x:501:501::/home/usr001:/bin/bash
= “grep usr001
/etc/passwd”
LINUX Básico (6. Shells(1)) 25
26. 6.5 Comillas y apóstrofos
(1) Comillas " "
• Las comillas " " desactivan los caracteres especiales, “*”, “?”, “[”,
“]”, “>”, “<”, ...
• Sin embargo, la sustitución de variables “$” y comandos ` ` aún
se lleva a afecto.
[usr000@linuxpc usr000]$ ls
a el carácter comodín
[usr000@linuxpc usr000]$ ls *
a un nombre de archivo
[usr000@linuxpc usr000]$ ls "*"
ls: *: No existe el fichero o el directorio
[usr000@linuxpc usr000]$ date > " " un archivo del
[usr000@linuxpc usr000]$ ls -l que nombre es un archivo
un espacio. existe.
total 4
-rw-rw-r-- 1 usr000 usr000 29 sep 17 09:47
-rw-rw-r-- 1 usr000 usr000 0 sep 17 09:46 a
[usr000@linuxpc usr000]$ cat " "
vie sep 17 09:47:08 ECT 2004
[usr000@linuxpc usr000]$ rm " "
[usr000@linuxpc usr000]$
LINUX Básico (6. Shells(1)) 26
27. sustitución de variables
[usr000@linuxpc usr000]$ echo $HOME
/home/usr000
[usr000@linuxpc usr000]$ echo "$HOME" para desactivar
/home/usr000 la sustitución,
[usr000@linuxpc usr000]$ echo "$HOME" "" es necesario.
$HOME
[usr000@linuxpc usr000]$ echo `whoami` sustitución de
usr000 comandos
[usr000@linuxpc usr000]$ echo "`whoami`"
usr000
[usr000@linuxpc usr000]$ echo "`whoami`" para desactivar
`whoami` la sustitución,
"" es necesario.
LINUX Básico (6. Shells(1)) 27
28. (2) Apóstrofos ' '
• Los apóstrofos ' ' desactivan todo el análisis sintáctico de shell.
[usr000@linuxpc usr000]$ ls
a el carácter comodín
[usr000@linuxpc usr000]$ ls ?
a un nombre de archivo
[usr000@linuxpc usr000]$ ls '?'
ls: ?: No existe el fichero o el directorio
[usr000@linuxpc usr000]$ echo $HOME sustitución de variables
/home/usr000
[usr000@linuxpc usr000]$ echo '$HOME' se ha desactivado
$HOME la sustitución.
[usr000@linuxpc usr000]$ echo `whoami`
usr000 sustitución de
[usr000@linuxpc usr000]$ echo '`whoami`' comandos
`whoami`
se ha desactivado
la sustitución.
LINUX Básico (6. Shells(1)) 28
29. 6.6 Grupos de comandos
(1) Secuencia de comandos (punto y coma “;”)
• Un comando simple se concluye con un “Enter”.
• Si quiere colocar múltiples comandos en una línea de comando
antes de presionar “Enter”, puede delimitar comandos individuales
con un signo de punto y coma “;”.
comando1 ; comando2 ; comando3
• El shell ejecuta cada comando en secuencia, como si usted hubiera
escrito cada uno de ellos de forma independiente en una línea.
[usr000@linuxpc usr000]$ whoami ; date ; cal
usr000
vie sep 17 10:43:44 ECT 2004
septiembre de 2004
do lu ma mi ju vi sá
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
LINUX Básico (6. Shells(1)) 29
30. 6.6(2) Grupos de comandos
Llaves { }
• Si quiere redireccionar la entrada o la salida hacia todos los
comandos como un grupo, puede hacerlo al convertir la línea de
comando en un grupo de comandos.
• Un grupo de comandos son varios comandos encerrados entre
llaves { }.
{ comando1; comando2; } > archivo
{ comando1; comando2; } | archivo
un espacio es punto y coma es necesario.
necesario.
[usr000@linuxpc usr000]$ { whoami; date; } > a
[usr000@linuxpc usr000]$ cat a
usr000
vie sep 17 11:08:30 ECT 2004
[usr000@linuxpc usr000]$ { whoami; date; } | sort -r
vie sep 17 11:09:23 ECT 2004
usr000
LINUX Básico (6. Shells(1)) 30
31. ¡ Muchas gracias por su atención !
¡ Hasta pronto !
En la próxima hora, vamos a aprender sobre el
control de procesos.
LINUX Básico (6. Shells(1)) 31